home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
c
/
pro19
/
cc42.c
< prev
next >
Wrap
Text File
|
1987-10-04
|
5KB
|
307 lines
/*
** Small C - 8088/8086 version - modified by R. Grehan, BYTE Magazine
**
** add primary and secondary registers (result in primary)
*/
ffadd() {ol(" ADD BX,DX");}
/*
** subtract primary from secondary register (result in primary)
*/
ffsub() {ol(" SUB DX,BX"); ol(" MOV BX,DX");}
/*
** multiply primary and secondary registers (result in primary)
*/
ffmult() {ol(" MOV AX,DX"); ol(" IMUL BX"); ol(" MOV BX,AX");}
/*
** divide secondary by primary register
** (quotient in primary, remainder in secondary)
*/
ffdiv() {ol(" MOV AX,DX"); ol(" SUB DX,DX"); ol(" IDIV BX");
ol(" MOV BX,AX"); }
/*
** remainder of secondary/primary
** (remainder in primary, quotient in secondary)
*/
ffmod() {ffdiv();swap();}
/*
** inclusive "or" primary and secondary registers
** (result in primary)
*/
ffor() {ol(" OR BX,DX");}
/*
** exclusive "or" the primary and secondary registers
** (result in primary)
*/
ffxor() {ol(" XOR BX,DX");}
/*
** "and" primary and secondary registers
** (result in primary)
*/
ffand() {ol(" AND BX,DX");}
/*
** logical negation of primary register
*/
lneg() {
ol(" OR BX,BX");
ol(" MOV BX,CX");
ol(" JNZ $+3");
ol(" INC BX");
}
/*
** arithmetic shift right secondary register
** number of bits given in primary register
** (result in primary)
** 8088 version: Note that I don't check BH to make
** sure there's nothing in it. Might be a problem.--RG
*/
ffasr() {ol(" MOV CL,BL"); ol(" SAR DX,CL"); ol(" MOV BX,DX");
ol(" XOR CX,CX"); }
/*
** arithmetic shift left secondary register
** number of bits given in primary register
** (result in primary)
*/
ffasl() {ol(" MOV CL,BL"); ol(" SAL DX,CL"); ol(" MOV BX,DX");
ol(" XOR CX,CX"); }
/*
** two's complement primary register
*/
neg() {ol(" NEG BX");}
/*
** one's complement primary register
*/
com() {ol(" NOT BX");}
/*
** increment primary register by one object of whatever size
** 8088 version: I altered this slightly from the original
** code since it's easier to do 16-bit math on the 8088 --RG
*/
inc(n) int n; {
if (n<=2) {
while(1) {
ol(" INC BX");
if(--n < 1) break;
}
}
else
{ ot(" ADD BX,");
outdec(n);
nl();
}
}
/*
** decrement primary register by one object of whatever size
** 8088 version: Same thing as inc(n) --RG
*/
dec(n) int n; {
if (n<=2) {
while(1) {
ol(" DEC BX");
if(--n < 1) break;
}
}
else
{ ot(" SUB BX,");
outdec(n);
nl();
}
}
/*
** test for equal to
*/
ffeq() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JNZ $+3");
ol(" INC BX");
}
/*
** test for equal to zero
*/
eq0(label) int label; {
ol(" OR BX,BX");
ol(" JZ $+5");
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for not equal to
*/
ffne() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JE $+3");
ol(" INC BX");
}
/*
** test for not equal to zero
*/
ne0(label) int label; {
ol(" OR BX,BX");
ol(" JNZ $+5");
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for less than (signed)
*/
fflt() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JGE $+3");
ol(" INC BX");
}
/*
** test for less than zero
*/
lt0(label) int label; {
ol(" OR BX,BX");
ol(" JS $+5");
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for less than or equal to (signed)
*/
ffle() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JG $+3");
ol(" INC BX");
}
/*
** test for less than or equal to zero
*/
le0(label) int label; {
ol(" OR BX,BX");
ol(" JLE $+5");
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for greater than (signed)
*/
ffgt() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JLE $+3");
ol(" INC BX");
}
/*
** test for greater than zero
*/
gt0(label) int label; {
ol(" OR BX,BX");
ol(" JG $+5");
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for greater than or equal to (signed)
*/
ffge() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JL $+3");
ol(" INC BX");
}
/*
** test for greater than or equal to zero
*/
ge0(label) int label; {
ol(" OR BX,BX");
ol(" JGE $+5");
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for less than (unsigned)
*/
ult() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JAE $+3");
ol(" INC BX");
}
/*
** test for less than zero (unsigned)
*/
ult0(label) int label; {
ot(" JMP ");
printlabel(label);
nl();
}
/*
** test for less than or equal to (unsigned)
*/
ule() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JA $+3");
ol(" INC BX");
}
/*
** test for greater than (unsigned)
*/
ugt() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JBE $+3");
ol(" INC BX");
}
/*
** test for greater than or equal to (unsigned)
*/
uge() {
ol(" CMP DX,BX");
ol(" MOV BX,CX");
ol(" JB $+3");
ol(" INC BX");
}
#ifdef OPTIMIZE
peephole(ptr) char *ptr; {
while(*ptr) {
cout(*ptr++,output);
}
}
#endif